class Solution {
public:
    //判断是否可以在maxOperations次操作中，让所有大于mid(max)的袋子都分为一个个小于等于mid的袋子
    bool check(vector<int>& nums,int max,int maxOperations)
    {
        int ans=0;
        for(int i=0;i<nums.size();i++)
        {
            int x=nums[i];
            ans+=(x-1)/max;
            //比如，一共17个，要分为单堆最多4个，根据分页思想，最多分为(17 + 4 - 1) / 4 = 5，既然要分为5堆，那么最少最少要做4次操作，即：(n + k - 1) / k - 1 =>> (n - 1) / k
            if(ans>maxOperations)
                return false;
        }
        return true;
    }
    int minimumSize(vector<int>& nums, int maxOperations) {
        sort(nums.begin(),nums.end());
        int ans=0;
        int l=1;//值，不是下标
        int r=nums.back();
        while(l<=r)
        {
            int mid=(l+r)>>1;
            if(check(nums,mid,maxOperations))
            {
                ans=mid;
                r=mid-1;
            }
            else
            {
                l=mid+1;
            }
        }
        return ans;
    }
};